package IT.DataAccess;

import IT.Entities.ProyectoEtapa;
import IT.Entities.ProyectoEtapaHistorial;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import java.util.logging.Level;
import java.util.logging.Logger;

public class DatProyectoEtapa implements IDatProyectoEtapa{
    
    private ProyectoEtapa oEtapa;
    private List<ProyectoEtapa> oLista;
    private ProyectoEtapaHistorial oHistorial;
    private List<ProyectoEtapaHistorial> oListaHis;     
    private BDConexion oBase;
    
    private Connection oConexion;
    private CallableStatement oCst;    
    private ResultSet oRst;    
    
    public List<ProyectoEtapa> Listar() {
         oLista=new ArrayList<ProyectoEtapa>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaListar()}");         
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oLista.add(new ProyectoEtapa(oRst.getInt("cod_eta_in"),oRst.getInt("ord_eta_in"), 
                        oRst.getString("nom_eta_vc"), oRst.getString("obs_eta_vc"),
                        oRst.getInt("est_eta_in"), oRst.getString("Estado"),
                        oRst.getInt("cod_proy_in"), 
                        oRst.getInt("cod_emp_in"), oRst.getString("Empleado"),
                        oRst.getInt("cod_plaeta_in"),
                        oRst.getInt("Cantidad")));             
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       return oLista;
    }

    public ProyectoEtapa Ind(int nCodigo) {
        oEtapa=new ProyectoEtapa();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaInd(?)}");        
            oCst.setInt(1, nCodigo);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
               oEtapa.setCod_eta_in(oRst.getInt("cod_eta_in"));
               oEtapa.setOrd_eta_in(oRst.getInt("ord_eta_in"));
               oEtapa.setNom_eta_vc(oRst.getString("nom_eta_vc"));
               oEtapa.setObs_eta_vc(oRst.getString("obs_eta_vc"));
               oEtapa.setEst_eta_in(oRst.getInt("est_eta_in"));
               oEtapa.setEstado(oRst.getString("Estado"));
               oEtapa.setCod_proy_in(oRst.getInt("cod_proy_in"));
               oEtapa.setCod_emp_in(oRst.getInt("cod_emp_in"));
               oEtapa.setEmpleado(oRst.getString("Empleado"));
               oEtapa.setCod_plaeta_in(oRst.getInt("cod_plaeta_in"));
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       return oEtapa;
    }

    public List<ProyectoEtapa> Ubi(int nProyecto) {
        oLista=new ArrayList<ProyectoEtapa>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaUbi(?)}");        
            oCst.setInt(1, nProyecto);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oLista.add(new ProyectoEtapa(oRst.getInt("cod_eta_in"),oRst.getInt("ord_eta_in"), 
                        oRst.getString("nom_eta_vc"), oRst.getString("obs_eta_vc"),
                        oRst.getInt("est_eta_in"), oRst.getString("Estado"),
                        oRst.getInt("cod_proy_in"), 
                        oRst.getInt("cod_emp_in"), oRst.getString("Empleado"),
                        oRst.getInt("cod_plaeta_in"),
                        oRst.getInt("Cantidad")));             
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       return oLista;
    }
    
    public List<ProyectoEtapa> Emp(String cEtapa,String cProyecto,String cCliente,
                                int nEstado, int nEmpleado) {
          oLista=new ArrayList<ProyectoEtapa>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaEmp(?,?,?, ?,?)}");
            oCst.setString(1, cEtapa);
            oCst.setString(2, cProyecto);
            oCst.setString(3, cCliente);
            oCst.setInt(4, nEstado);
            oCst.setInt(5, nEmpleado);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oLista.add(new ProyectoEtapa(oRst.getInt("cod_eta_in"),oRst.getInt("ord_eta_in"), 
                        oRst.getString("nom_eta_vc"), oRst.getString("obs_eta_vc"),
                        oRst.getInt("est_eta_in"), oRst.getString("Estado"),
                        oRst.getInt("cod_proy_in"), oRst.getString("nom_proy_vc"),
                        oRst.getInt("cod_emp_in"), oRst.getString("Empleado"),
                        oRst.getInt("Actividad"),
                        oRst.getInt("cod_cli_in"),
                        oRst.getInt("cod_pro_in"),
                        oRst.getInt("tip_per_in"),
                        oRst.getString("tip_per_vc"),
                        oRst.getString("Cliente"),
                        oRst.getInt("Cantidad"),
                        oRst.getInt("cod_plaeta_in"),
                        oRst.getString("nom_plaproy_vc"),
                        oRst.getString("cod_proy_vc")));             
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       return oLista;
    }
    
    public int Insertar(ProyectoEtapa ent) {
       int nCodigo=0;
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaInsertar(?,?,?, ?,?,?, ?,?,?)}");     
    
            oCst.registerOutParameter(1, java.sql.Types.INTEGER);  
            oCst.setInt(2, ent.getOrd_eta_in());              
            oCst.setString(3, ent.getNom_eta_vc());
            oCst.setString(4, ent.getObs_eta_vc());
            oCst.setInt(5, ent.getEst_eta_in());
            oCst.setInt(6, ent.getCod_proy_in());            
            oCst.setInt(7, ent.getCod_emp_in());
            oCst.setInt(8, ent.getCod_plaeta_in());
            oCst.setInt(9, ent.getCod_ant_eta_in());
            
            oCst.execute();
            nCodigo=oCst.getInt(1);
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       return nCodigo;
    }

    public void Editar(ProyectoEtapa ent) {
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaEditar(?,?,?, ?,?,?, ?)}");     
    
            oCst.setInt(1, ent.getCod_eta_in());   
            oCst.setInt(2, ent.getOrd_eta_in());              
            oCst.setString(3, ent.getNom_eta_vc());
            oCst.setString(4, ent.getObs_eta_vc());
            oCst.setInt(5, ent.getEst_eta_in());
            oCst.setInt(6, ent.getCod_proy_in());            
            oCst.setInt(7, ent.getCod_emp_in());
            
            oCst.execute();         
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void Eliminar(int nCodigo) {
         try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaEliminar(?)}");     
    
            oCst.setInt(1, nCodigo);  
          
            oCst.execute();         
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    //Historial
    public List<ProyectoEtapaHistorial> ListarHis() {
         oListaHis=new ArrayList<ProyectoEtapaHistorial>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaHistorialListar()}");         
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oListaHis.add(new ProyectoEtapaHistorial(oRst.getInt("cod_etahis_in"), 
                        oRst.getInt("tip_etahis_in"), oRst.getString("Tipo"), 
                        oRst.getDate("fec_etahis_dt"), oRst.getString("fec_etahis_vc"), 
                        oRst.getInt("res_etahis_in"), 
                        oRst.getString("Rspta"), oRst.getString("obs_etahis_vc"), 
                        oRst.getInt("cod_emp_in"), 
                        oRst.getInt("cod_eta_in"), 
                        oRst.getString("Empleado")));             
            }             
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       return oListaHis;
     
    }

    public ProyectoEtapaHistorial IndHis(int nCodigo) {
        oHistorial=new ProyectoEtapaHistorial();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaHistorialInd()}");    
            oCst.setInt(1, nCodigo);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oHistorial.setCod_etahis_in(oRst.getInt("cod_etahis_in"));
                oHistorial.setTip_etahis_in(oRst.getInt("tip_etahis_in"));
                oHistorial.setTipo(oRst.getString("Tipo"));
                oHistorial.setFec_etahis_dt(oRst.getDate("fec_etahis_dt"));
                oHistorial.setFec_etahis_vc(oRst.getString("fec_etahis_vc"));
                oHistorial.setRes_etahis_in(oRst.getInt("res_etahis_in"));
                oHistorial.setRspta(oRst.getString("Rspta"));
                oHistorial.setObs_etahis_vc(oRst.getString("obs_etahis_vc"));
                oHistorial.setCod_emp_in(oRst.getInt("cod_emp_in"));
                oHistorial.setCod_eta_in(oRst.getInt("cod_eta_in"));
                oHistorial.setEmpleado(oRst.getString("Empleado"));
            }             
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       return oHistorial;
    }

    public List<ProyectoEtapaHistorial> UbiHis(int nEtapa) {
        oListaHis=new ArrayList<ProyectoEtapaHistorial>();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaHistorialUbi(?)}");         
            oCst.setInt(1, nEtapa);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oListaHis.add(new ProyectoEtapaHistorial(oRst.getInt("cod_etahis_in"), 
                        oRst.getInt("tip_etahis_in"), oRst.getString("Tipo"), 
                        oRst.getDate("fec_etahis_dt"), oRst.getString("fec_etahis_vc"), 
                        oRst.getInt("res_etahis_in"), 
                        oRst.getString("Rspta"), oRst.getString("obs_etahis_vc"), 
                        oRst.getInt("cod_emp_in"), 
                        oRst.getInt("cod_eta_in"), 
                        oRst.getString("Empleado")));             
            }             
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       return oListaHis;
    }

    public void InsertarHis(ProyectoEtapaHistorial ent) {
         try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaHistorialInsertar(?,?,?, ?,?)}");     
    /*  _tip_etahis_in INTEGER , _res_etahis_in INTEGER ,
  _obs_etahis_vc VARCHAR(300) , _cod_emp_in INTEGER , _cod_eta_in INTEGER */
            
            oCst.setInt(1, ent.getTip_etahis_in());              
            oCst.setInt(2, ent.getRes_etahis_in());
            oCst.setString(3, ent.getObs_etahis_vc());
            oCst.setInt(4, ent.getCod_emp_in());
            oCst.setInt(5, ent.getCod_eta_in());                        
            
            oCst.execute();           
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public ProyectoEtapaHistorial UltHis(int nEtapa, int nTipo) {
        oHistorial=new ProyectoEtapaHistorial();
         
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaHistorialUltimo(?,?)}");    
            oCst.setInt(1, nEtapa);
            oCst.setInt(2, nTipo);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oHistorial.setCod_etahis_in(oRst.getInt("cod_etahis_in"));
                oHistorial.setTip_etahis_in(oRst.getInt("tip_etahis_in"));
                oHistorial.setTipo(oRst.getString("Tipo"));
                oHistorial.setFec_etahis_dt(oRst.getDate("fec_etahis_dt"));
                oHistorial.setFec_etahis_vc(oRst.getString("fec_etahis_vc"));
                oHistorial.setRes_etahis_in(oRst.getInt("res_etahis_in"));
                oHistorial.setRspta(oRst.getString("Rspta"));
                oHistorial.setObs_etahis_vc(oRst.getString("obs_etahis_vc"));
                oHistorial.setCod_emp_in(oRst.getInt("cod_emp_in"));
                oHistorial.setCod_eta_in(oRst.getInt("cod_eta_in"));
                oHistorial.setEmpleado(oRst.getString("Empleado"));
            }             
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       return oHistorial;
    }

    public int UltEtapa(int nCodigo) {
        int nResultado=0;
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaExiste(?,?)}");
            oCst.setInt(1, nCodigo);           
            oCst.registerOutParameter(2, java.sql.Types.INTEGER);
            oCst.execute();
            nResultado=oCst.getInt(2);

            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatProyectoEtapa.class.getName()).log(Level.SEVERE, null, ex);
        }
        return nResultado;   
    }

    public void EditarUlt(int nCodigo, int nEmpleado) {
        try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaUlt(?,?)}");     
    
            oCst.setInt(1, nCodigo);   
            oCst.setInt(2, nEmpleado);
            
            oCst.execute();         
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<ProyectoEtapa> UbiAnt(int nEtapa) {
       oLista=new ArrayList<ProyectoEtapa>();
         
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaUbiUlt(?)}");        
            oCst.setInt(1, nEtapa);
            oRst = oCst.executeQuery();

            while (oRst.next()) {
                oLista.add(new ProyectoEtapa(oRst.getInt("cod_eta_in"),oRst.getInt("ord_eta_in"), 
                        oRst.getString("nom_eta_vc"), oRst.getString("obs_eta_vc"),
                        oRst.getInt("est_eta_in"), oRst.getString("Estado"),
                        oRst.getInt("cod_proy_in"), 
                        oRst.getInt("cod_emp_in"), oRst.getString("Empleado"),
                        oRst.getInt("cod_plaeta_in"),
                        oRst.getInt("Cantidad")));             
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
       }
       
       return oLista;
    }

    public void Estado(int nCodigo, int nEstado) {
          try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaEstado(?,?)}");     
    
            oCst.setInt(1, nCodigo);  
            oCst.setInt(2, nEstado);  
          
            oCst.execute();         
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
     public void Asignar(int nCodigo, int nProyecto) {
         try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaAsignacion(?,?)}");    
                   
            oCst.setInt(1, nCodigo);              
            oCst.setInt(2, nProyecto);
         
            oCst.execute();          
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatProyectoActividad.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<ProyectoEtapa> EtapaSig(int nCodigo) {
        oLista=new ArrayList<ProyectoEtapa>();
         
       try {
            oBase = new BDConexion();
            oConexion = oBase.getDataSource().getConnection();
            oBase = null;
            oCst = oConexion.prepareCall("{call usp_ProyectoEtapaSig(?)}");        
            oCst.setInt(1, nCodigo);
            oRst = oCst.executeQuery();

            while (oRst.next()) {                
                oLista.add(new ProyectoEtapa(oRst.getInt("cod_eta_in"),oRst.getInt("ord_eta_in"), 
                        oRst.getString("nom_eta_vc"), oRst.getString("obs_eta_vc"),
                        oRst.getInt("est_eta_in"), oRst.getString("Estado"),
                        oRst.getInt("cod_proy_in"), 
                        oRst.getInt("cod_emp_in"), oRst.getString("Empleado"),
                        oRst.getInt("cod_plaeta_in"),
                        oRst.getInt("Cantidad")));             
            }
            oRst.close();
            oCst.close();
            oConexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(DatArea.class.getName()).log(Level.SEVERE, null, ex);
       }
       
       return oLista;
    }
}
